home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode New for 1.6 / ViewerCallbackSample / Source / Viewer_Main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  7.9 KB  |  395 lines  |  [TEXT/CWIE]

  1. /* 
  2.  *    Viewer_Main.c
  3.  *
  4.  *    QuickDraw 3D 1.6 Sample
  5.  *    Robert Dierkes
  6.  *
  7.  *     12/22/98    RDD        Created.
  8.  */
  9.  
  10. /*------------------*/
  11. /*    Include Files    */
  12. /*------------------*/
  13. #include "QD3D.h"
  14. #include "QD3DViewer.h"
  15.  
  16. #if defined(OS_MACINTOSH) && OS_MACINTOSH
  17. #include <Fonts.h>
  18. #include <MacWindows.h>
  19. #include <StandardFile.h>    /* SFTypeList */
  20. #endif
  21.  
  22. #include "Viewer_Error.h"
  23. #include "Viewer_Callbacks.h"
  24. #include "Viewer_Events.h"
  25. #include "Viewer_Message.h"
  26. #include "Viewer_Main.h"
  27. #include "Viewer_Menu.h"
  28. #include "Viewer_Window.h"
  29. #include "Viewer_System.h"
  30.  
  31.  
  32.  
  33. /*----------------------*/
  34. /*    Global Declarations    */
  35. /*----------------------*/
  36. TQ3Boolean        gTimeToQuit;
  37. WindowRef        gAppResizeWindow = NULL; /* For example 2 */
  38.  
  39.  
  40. /*----------------------*/
  41. /*    Local Prototypes    */
  42. /*----------------------*/
  43. static
  44. TQ3Boolean Main_Initialize(
  45.             void);
  46. static
  47. TQ3Boolean Main_Exit(
  48.             void);
  49. static
  50. void    Main_Initialize_Toolbox (
  51.             void);
  52. static
  53. TQ3Boolean    Main_CreateViewerInWindow(
  54.             unsigned long    viewerFlags,
  55.             Rect            *pWindowRect,
  56.             short            viewerInset,
  57.             Str255            title,
  58.             WindowPtr        *pWindow,
  59.             TQ3ViewerObject    *pViewer);
  60. static
  61. TQ3Status Main_CreateViewer(
  62.             unsigned long    example,
  63.             short            fileRefNum,
  64.             WindowPtr        *hWindow);
  65. static
  66. TQ3Status Main_GetModelFileRef(
  67.             short            *pRefNum);
  68.  
  69.  
  70. /*
  71.  *    main
  72.  */
  73. void main(
  74.         void)
  75. {
  76.     if (Main_Initialize()) {
  77.         Events_Process();
  78.         Main_Exit();
  79.     }
  80. }
  81.  
  82.  
  83. /*
  84.  *    Main_Initialize
  85.  */
  86. static
  87. TQ3Boolean Main_Initialize(
  88.             void)
  89. {
  90.     short        fileRefNum = 0;
  91.     long        i;
  92.  
  93.     gTimeToQuit = kQ3False;
  94.  
  95.     Main_Initialize_Toolbox();
  96.  
  97.     if (Events_Initialize() == false)
  98.         return kQ3False;
  99.  
  100.     if (QuickDraw3D_Initialize() == kQ3False)
  101.         return kQ3False;
  102.  
  103.     Message_Register();
  104.  
  105.     if (Menu_Initialize() == kQ3False)
  106.         return kQ3False;
  107.  
  108.  
  109.     /* Select a model */
  110.     if (Main_GetModelFileRef(&fileRefNum) == kQ3Failure) {
  111.         return kQ3False;
  112.     }
  113.  
  114.     if (Window_Initialize() == kQ3Failure) {
  115.         return kQ3False;
  116.     }
  117.  
  118.     i = kMaxWindowCount;
  119.     while (--i >= 0) {
  120.         if (Main_CreateViewer(i, fileRefNum, &gWindows[i]) == kQ3Failure)
  121.             return kQ3False;
  122.     }
  123.  
  124.     return kQ3True;
  125. }
  126.  
  127.  
  128. /*
  129.  *    Main_Initialize_Toolbox
  130.  *
  131.  */
  132. static
  133. void Main_Initialize_Toolbox(
  134.             void)
  135. {
  136.     MaxApplZone();
  137.     MoreMasters();
  138.     MoreMasters();
  139.     MoreMasters(); 
  140.  
  141.     InitGraf(&qd.thePort);
  142.     InitFonts();
  143.     InitWindows();
  144.     InitCursor();
  145.     
  146.     /*
  147.      * Must call this to expand heap is expanded to maximum
  148.      * size before calling any Viewer routines
  149.      */
  150.     MaxApplZone();
  151. }
  152.  
  153.  
  154. /*
  155.  *    Main_Exit
  156.  */
  157. static
  158. TQ3Boolean Main_Exit(
  159.             void)
  160. {
  161.     if (gTimeToQuit) {
  162.         (void) Window_Exit();
  163.  
  164.         (void) QuickDraw3D_Exit();
  165.         gTimeToQuit = kQ3False;
  166.     }
  167.  
  168.     return kQ3True;
  169. }
  170.  
  171.  
  172. #pragma mark -
  173.  
  174. /*
  175.  * Main_CreateViewer
  176.  */
  177. TQ3Status Main_CreateViewer(
  178.         unsigned long    example,
  179.         short            fileRefNum,
  180.         WindowPtr        *hWindow)
  181. {
  182.     const    short    kWindowHeight    = 240;
  183.     const    short    kWindowWidth    = 360;
  184.  
  185.     const    short    kWindowLeft        = 12;
  186.     const    short    kWindowTop        = 48;
  187.     const    short    kWindowRight    = (kWindowLeft + kWindowWidth);
  188.     const    short    kWindowBottom    = (kWindowTop  + kWindowHeight);
  189.  
  190.     const    short    kWindowOffset    = 24;
  191.     const    short    kViewerInset    = 20;
  192.  
  193.     TQ3Status        status            = kQ3Failure;
  194.     OSErr            theErr            = paramErr;
  195.     TQ3ViewerObject    viewer            = NULL;
  196.     unsigned long    viewerFlags;
  197.     short            windowOffset;
  198.     short            viewerInset;
  199.     Rect            windowRect  = { kWindowTop, kWindowLeft, kWindowBottom, kWindowRight };
  200.     Str255            winTitles[] = {    "\pDefault Viewer",
  201.                                     "\pViewer with Window Grow Box",
  202.                         /* TODO */    "\pViewer with Application Window Grow Box",
  203.                                     "\pViewer with Pane Grow Box and Callback",
  204.                                     "\pViewer with Pane & Window Grow Boxes",
  205.                                     "\pViewer with Drawing Callback"
  206.                                     };
  207.  
  208.     /* Customize Viewer's appearance and functions */
  209.     viewerFlags =     kQ3ViewerButtonCamera        |
  210.                     kQ3ViewerButtonTruck        |
  211.                     kQ3ViewerButtonOrbit        |
  212.                     kQ3ViewerButtonDolly        |
  213.                     kQ3ViewerButtonReset        |
  214.                     kQ3ViewerButtonOptions        |
  215.                     kQ3ViewerDrawDragBorder        |
  216.                     kQ3ViewerControllerVisible    |
  217.                     kQ3ViewerActive;
  218.  
  219.     switch (example) {
  220.  
  221.     default:
  222.     case 0:    /* Use default Viewer flags and behavior */
  223.         viewerFlags  = kQ3ViewerDefault;
  224.         viewerInset  = 0;
  225.         break;
  226.  
  227.     case 1:    /* Viewer draws window grow box and handles window resizing */
  228.         viewerFlags |= kQ3ViewerDrawGrowBox;
  229.         viewerInset  = 0;
  230.         break;
  231.  
  232.     case 2:    /* Viewer draws window grow box and notifies app after it's been resized */
  233.         viewerFlags  = kQ3ViewerDefault;
  234. //TODO        viewerFlags |= kQ3ViewerDrawGrowBox;
  235.         viewerInset  = 0;
  236.         break;
  237.  
  238.     case 3:    /* Viewer draws pane grow box and notifies app when it's been resized */
  239.         viewerFlags |= kQ3ViewerPaneGrowBox;
  240.         viewerInset  = kViewerInset;
  241.         break;
  242.  
  243.     case 4:    /* Viewer draws window & pane grow box and notifies app after pane grow box has been resized */
  244.         viewerFlags |= (kQ3ViewerPaneGrowBox | kQ3ViewerDrawGrowBox);
  245.         viewerInset  = kViewerInset;
  246.         break;
  247.  
  248.     case 5:    /* Viewer notifies app after it's completed drawing */
  249.         viewerFlags  = kQ3ViewerDefault;
  250.         viewerInset  = kViewerInset;
  251.         break;
  252.     }
  253.  
  254.     windowOffset = example * kWindowOffset;
  255.     MacOffsetRect(&windowRect, windowOffset, windowOffset);
  256.  
  257.     /*
  258.      * Create a Viewer with these flags
  259.      */
  260.     if (Main_CreateViewerInWindow(
  261.             viewerFlags,
  262.             &windowRect,
  263.             viewerInset,
  264.             winTitles[example],
  265.             hWindow,
  266.             &viewer) == kQ3False) {
  267.         return kQ3Failure;
  268.     }
  269.  
  270.     /*
  271.      * Add Viewer model from user selected file
  272.      */
  273.     if (Q3ViewerUseFile(viewer, fileRefNum) != noErr) {
  274.         ERROR_DEBUG_STR("Main_CreateViewer: Q3ViewerUseFile failed.");
  275.         return kQ3Failure;
  276.     }
  277.  
  278.     /*
  279.      * Set callback
  280.      */
  281.     switch (example) {
  282.  
  283.     /* Use default Viewer flags and behavior */
  284.     default:
  285.     case 0:    status = kQ3Success;    break;
  286.  
  287.     /* Viewer draws window grow box and handles window resizing */
  288.     case 1:    status = kQ3Success;    break;
  289.  
  290.     /* Viewer draws window grow box and calls app to resize window */
  291.     case 2:    status = Callbacks_InitWindowResizeCallback(viewer, *hWindow);
  292.         gAppResizeWindow = *hWindow;
  293.         break;
  294.  
  295.     /* Viewer draws pane grow box and notifies app when it's been resized */
  296.     case 3:    status = Callbacks_InitPaneResizeCallback(viewer, *hWindow, 0);    break;
  297.  
  298.     /* Viewer draws window & pane grow box and notifies app after pane grow box has been resized */
  299.     case 4:    status = Callbacks_InitPaneResizeCallback(viewer, *hWindow, 1);    break;
  300.  
  301.     /* Viewer notifies app after it's completed drawing */
  302.     case 5:    status = Callbacks_InitDrawingCallback(viewer, *hWindow);        break;
  303.     }
  304.  
  305.     return status;
  306. }
  307.  
  308.  
  309. /*
  310.  *    Main_CreateViewerInWindow
  311.  */
  312. static
  313. TQ3Boolean Main_CreateViewerInWindow(
  314.     unsigned long    viewerFlags,
  315.     Rect            *pWindowRect,
  316.     short            viewerInset,
  317.     Str255            title,
  318.     WindowPtr        *pWindow,
  319.     TQ3ViewerObject    *pViewer)
  320. {
  321.     WindowPtr        window = NULL;
  322.     Rect            viewerRect;
  323.  
  324.     /*
  325.      * Create a window
  326.      */
  327.     if ((*pWindow = GetNewCWindow(kWindowRsrcID, NULL, kWindowOnTop)) == NULL) {
  328.         ERROR_DEBUG_STR("Main_CreateViewerInWindow: NewCWindow failed.");
  329.         return kQ3False;
  330.     }
  331.     window = *pWindow;
  332.  
  333.     SetPort((GrafPtr) window);
  334.  
  335.     MacMoveWindow(
  336.             window,
  337.             pWindowRect->left,
  338.             pWindowRect->top,
  339.             true);
  340.     SizeWindow(
  341.             window,
  342.             (pWindowRect->right  - pWindowRect->left),
  343.             (pWindowRect->bottom - pWindowRect->left),
  344.             true);
  345.     SetWTitle(window, title);
  346.     ShowWindow(window);
  347.  
  348.     /*
  349.      * Add a Viewer to this window
  350.      */
  351.     viewerRect = window->portRect;
  352.     MacInsetRect(&viewerRect, viewerInset, viewerInset);
  353.  
  354.     if ((*pViewer = Q3ViewerNew(
  355.                         (CGrafPtr) window,
  356.                         &viewerRect,
  357.                         viewerFlags)) == NULL) {
  358.         ERROR_DEBUG_STR("Main_CreateViewerInWindow: Q3ViewerNew failed.");
  359.         return kQ3False;
  360.     }
  361.  
  362.     /* Save reference to Viewer in window's refcon */
  363.     SetWRefCon(window, (long) *pViewer);
  364.  
  365.     return kQ3True;
  366. }
  367.  
  368.  
  369. /*
  370.  *    Main_GetModelFileRef
  371.  */
  372. static
  373. TQ3Status Main_GetModelFileRef(
  374.     short                *pRefNum)
  375. {
  376.     TQ3Status            status   = kQ3Failure;
  377.     short                numTypes = 1; 
  378.     SFTypeList            typeList = { '3DMF' };
  379.     StandardFileReply    sfReply;
  380.  
  381.     StandardGetFile(nil, numTypes, typeList, &sfReply);
  382.  
  383.     if (sfReply.sfGood) {
  384.         /* Open the file */
  385.         if (FSpOpenDF(&sfReply.sfFile, fsRdPerm, pRefNum) == noErr) {
  386.             status = kQ3Success;
  387.         }
  388.         else {
  389.             ERROR_DEBUG_STR("Main_GetModelFileRef: FSpOpenDF failed.");
  390.         }
  391.     }
  392.  
  393.     return status;
  394. }
  395.